# 0. 实现一个回文检测函数  例如：abccba
# 123321
# abccba

def palindrome(s):
    # 方法一
    # 将字符串给倒过了
    # ss = ''
    # for c in s:
    #     ss = c+ss
    # 比较
    # return ss == s
    # 方法二
    return s == s[::-1]

print(palindrome('abcde'))
print(palindrome('abba'))
print(palindrome('春城一色柳垂新色柳垂新自爱人人爱自新垂柳色新垂柳色一城春'))


# 1. 实现一个trim()函数，利用切片去除字符串前后的空格
#    
s = '   tom cruse    '
# 递归方法
def trim2(s):
    if s[0] == ' ':
        return trim2(s[1:])
    if s[-1] == ' ':
        return trim2(s[:-1])
    return s

# 循环方式
def trim(s):
    # 先切前面
    while s[0] == ' ':
        s = s[1:] 
    # 再切后面
    while s[-1] == ' ':
        s = s[:-1] 

    return s

print(len(s))
print(len(trim(s)))
print(len(trim2(s)))
print(trim2(s))


# 2. 定义一个函数，随机生成一个5位的验证码，包含A-Za-z0-9
import random

# random.randint(0,5)
# random.choice('abc')

def code():
    s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    r = ''
    for i in range(5):
        # r += random.choice(s)
        r += s[random.randint(0,61)]
    return r

print(code())



# 3. 将下面列表中的所有字符变为小写：(列表生成式)
l =     ['Tom','MIKE','VM','Python']
#     'Tom'.lower()



# 4. 使用迭代查找一个列表中的最大值和最小值，返回一个tuple
l = [3,6,23,12,9,99,87,1]

def max_min(l):
    max,min = l[0],l[0]
    for i in l:
        if max < i:
            max = i
        if min > i:
            min = i
    return max,min

print(max_min(l))



# 5. 利用map函数将字符串首字母变为大写,其余字母小写（使用lambda表达式）
# ['tom','MIKE','Tony'] -> ['Tom','Mike','Tony']
r = map(lambda x: x[0].upper()+x[1:].lower(),['tom','MIKE','Tony'])
print(list(r))

'''     选做题    '''
# 6. 使用生成器构造一个fibonacci数列
# 6. 使用生成器构造一个自然数数列
def fib():
    a,b=0,1
    while True:
        yield a
        a,b=b,a+b
    
s=fib()
print(s)
# print(next(s))
# print(next(s))
import time
# for i in s:
#     print(i)
#     time.sleep(0.5)



# 7. 使用闭包实现 计数器函数(高阶函数)

# 不安全
# count = count+1
# count += 10000



# 内部函数引用了外部函数的变量，称为闭包


# 8. 实现一个计时器装饰器
import time

def duration(func):

    def wrapper(*args,**kw):
        start = time.time()
        r = func(*args,**kw)
        end = time.time()
        print('函数%s耗时为%f秒'%(func.__name__,end-start)) 
        return r
    return wrapper

@duration
def fact(n):
    s = 1
    for i in range(1,n+1):
        s *= i
    return s

fact(10000)